<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

require_once(INCLUDES_DIR."question_base.class.php");
require_once(INCLUDES_DIR."example_question.class.php");

/*!
 * @page InstallPagePage Исходный код класса InstallPage
 * @include install_page.class.php
 */


/**
 * @class InstallPage
 * @brief страница для установки системы WebFormsQA \n
 * @ref InstallPagePage
 * 
 * В процессе установки пользователю предлагается указать "Настройки подключения к базе данных MySql",
 * пользователь может выбрать:
 * - Создать базу данных
 * - Ввести существующие настройки
 *  
 *  При создании базы данных пользователю предлагается ввести административный пароль "root" к серверу MySql,
 *  на следующей форме ввода: 
 * -  Введите имя хоста
 * -  Введите пароль администратора МySql
 * -  Введите имя базы данных в которой будет храниться информация сайта
 * -  Имя пользователя (login)
 * -  Пароль пользователя
 * -  Подтверждение пароля \n
 *  \n
 * -  Введите имя администратора
 * -  Введите пароль каторый будет использоваться для доступа в административную часть сайта
 * -  Подтверждение пароля  
 */
class InstallPage extends Page {

	
    /** путь к каталогу с шаблонами Smarty 
     * @var string $path_template 
     */
    var $path_template;
	
	
    /**
     *  конструктор.
     *  @param object &$smarty_obj   - ссылка на обьект шаблона
     *  @param array  $attr          - массив атрибутов в формате attr["name"] = name_type;
     *  @param string $name_template - название шаблона
     */
    function InstallPage(&$smarty_obj, $attr, $name_template)
    {
        parent::Page(&$smarty_obj, $attr, $name_template);
    }

    /**
     *  @brief метод установки пути к текущему шаблону Smarty
     *  @param strign $path 	- путь к шаблону
     */
    function setPathTemplate($path)
    {
    	$this->path_template = $path;	
    }

    /** 
     * @brief обновить данные страницы
     * 
     *  Состояния страницы:
     * - 0 	-   Начальное состояние пользователю предлагается на выбор создать базу в MySQL
     *          или ввести существующие настройки
     * - 1	-   Ошибка установки, нет прав на перезапись конфигурационного файла
     * - 2	- 	Создание новой базы данных
     * - 3  -   Ввод существующих данных
     * - 4	-   Данные по новой базе введены и возникла ошибка в данных или при создании базы
     * - 5  -   База данных и пользователь успешно созданы
     * - 6  -   Конфигурационный файл успешно обновлен
     * - 7	-   файл install.php перемещен, установка завершена после создания базы
     * - 8  -   Проверка ввода существующих данных
     * - 9  -   Конфигурационный файл успешно обновлен
     * - 10	- 	файл install.php перемещен, установка после ввода данных завершена
     * - 11	    нет   
     * - 12	-   файл install.php перемещен, установка прервана
     * 
     * @return bool результат операции
     */
    function update()
    {
		// обновляем атрибуты страницы и их значения
        // а также главный шаблон Smarty
        if (parent::update()) {
        	

        	$base   = &$GLOBALS['base'];

            $state      	= 0;
            $state_create	= true;
            $config_file = CONFIG_DIR.CONFIG_FILE;
            
            $address_host = $root_mysql = $name_db_mysql = ""; 
            $first = $second = $second_repeat = ""; 
            $admin_first = $admin_second = $admin_second_repeat = "";
            $prefix_test = "testphpunit_";
            
            $add_demonstration = false;
            
            
            if( $this->attr["address_host"]["set"] )      	$address_host   = $this->attr['address_host']['value'];
            if( $this->attr["root_mysql"]["set"] )      	$root_mysql    	= $this->attr['root_mysql']['value'];
            if( $this->attr["name_db_mysql"]["set"] )   	$name_db_mysql  = $this->attr['name_db_mysql']['value'];
            if( $this->attr["first"]["set"] )     			$first  		= $this->attr['first']['value'];
            if( $this->attr["second"]["set"] )  			$second			= $this->attr['second']['value'];
            if( $this->attr["second_repeat"]["set"] )   	$second_repeat 	= $this->attr['second_repeat']['value'];
            	
            if( $this->attr["admin_first"]["set"] )		    $admin_first  		= $this->attr['admin_first']['value'];
            if( $this->attr["admin_second"]["set"] )		$admin_second  		= $this->attr['admin_second']['value'];
            if( $this->attr["admin_second_repeat"]["set"] ) $admin_second_repeat= $this->attr['admin_second_repeat']['value'];
            
            if( $this->attr["add_demonstration"]["set"] )   $add_demonstration= $this->attr['add_demonstration']['value'];
            

            if( $address_host == "" )  $address_host = "localhost";
            if( $name_db_mysql == "" ) $name_db_mysql = "WebFormsQA";
            if( $admin_first == "" )   $admin_first = "admin";
            
	       	// обратная связь для заполнения полей
            $reg_userinfo = array($address_host, $root_mysql, $name_db_mysql, $first, $second, $second_repeat, 
                                  $admin_first, $admin_second, $admin_second_repeat);
            $this->Smarty->assign("reg_userinfo", $reg_userinfo);
            
            
            if(!is_writable($config_file)) {
 				$state = 1;	
 			} else if( $this->attr["create_bd_button"]["set"] ) {
         		// создание базы данных и пользователя    	
		       	$state = 2;
		       	
            } else if( $this->attr["input_bd_button"]["set"] ) {
            	// ввод уже существующих данных
             	$state = 3;
             	$state_create	= false;
            } else if( $this->attr["return_create_bd"]["set"] ) {
            	$state 	= 0; 	
            } else if( $this->attr["create_ok"]["set"] ) {
				$state = 4;
            	
            	if( $address_host != "" && $first != "" && $second != "" && $second == $second_repeat &&
            	    $admin_first != "" && $admin_second != "" && $admin_second == $admin_second_repeat ) {
            		// данные проверены, пытаюсь создать базу
            		$error = "";
            		$create_user = true;
            	    if( DataBase::createDatabase($address_host, $root_mysql, $name_db_mysql, $first, $second, $create_user, &$error) ) {

            	    	// создаю также тестовую базу, для запуска тестов (PhpUnit)
            	    	$name_test = "$prefix_test"."$name_db_mysql";
            	    	$create_user = false;
            	    	DataBase::createDatabase($address_host, $root_mysql, $name_test, $first, $second, $create_user, &$error);

            	    	$state = 5;
						if( $this->saveContextConfig($config_file, $address_host, $name_db_mysql, $first, $second, 
                	                                 $admin_first, $admin_second, $prefix_test ) ) {
							$state = 6;
							//! перечитываю сохраненный файл 
							include(CONFIG_DIR."connect.dat.php");
							$base = new QuestionBase(DB_HOST, DB_USER, DB_PASS, DB_NAME);
							if( $base->Init() ) {
								// создаю таблицы базы данных	
								$error = "";
								if( $base->createTables($error) ) {
									$this->Smarty->assign("create_tables", TABLES_CREATE);
									// добавление демонстрационных данных
									if( $add_demonstration == 1 ) ExampleQuestionDatabase::addDemonstrationCategories($base);
									
								} else {
									$this->Smarty->assign("create_tables", $error);
								}
							}
                        }
						
            	    } else {
            	    	$this->Smarty->assign("error_create_bd", $error);
            	    }
                } else {
                	$this->Smarty->assign("error_create_bd", ERROR_REGISTER_FIELD);
                }
                
            } else if( $this->attr["input_ok"]["set"] ) {
				$state = 8;
				$state_create = false;
				
            	if( $address_host != "" && $first != "" && $second != "" && $second == $second_repeat &&
            	    $admin_first != "" && $admin_second != "" && $admin_second == $admin_second_repeat ) {
            	    
            		$base = new QuestionBase($address_host, $first, $second, $name_db_mysql);
	    			$code = $base->checkHostUserPassAndNameBase(&$error);
	    			
    				if( $code == 1 ) $this->Smarty->assign("error_input_bd", ERROR_CONNECT_BD);
    				else if( $code == 2 ) $this->Smarty->assign("error_input_bd", ERROR_SELECT_BD);
    				else {
    					if( $base->createTables($error) ) {
    						$this->Smarty->assign("succes_input_bd", TABLES_CREATE);
							// добавление демонстрационных данных
							if( $add_demonstration == 1 ) ExampleQuestionDatabase::addDemonstrationCategories($base);
    					}
    					
						if( $this->saveContextConfig($config_file, $address_host, $name_db_mysql, $first, $second, 
                  	                                 $admin_first, $admin_second, $prefix_test) ) {
                	    	$state = 9;
                    	}
    				}
                        
                } else {
                	$this->Smarty->assign("error_input_bd", ERROR_REGISTER_FIELD);
                } 
            }
                
            
            
            if( $this->attr["break_install_button"]["set"] || $state == 6 || $state == 9 ) {
            	// переношу файл установки в другой каталог
            	// при следующем обновлении будет запущен рабочий режим
				if( copy(INSTALL_FILE, INCLUDE_INSTALL.INSTALL_FILE ) ) {
					if( unlink(INSTALL_FILE) ) {
						unset( $_GET[ NAME_INSTALL_PAGE ] );
						// надо как то обновить страницу на стороне клиента
						// header('Location: WebFormsQA/index.php');
						if( $state == 9 ) $state = 10;
						else if( $state == 6 ) $state = 7;
						else $state = 12;
					}
				}
            }
             
            $this->Smarty->assign("state", $state);
            $this->Smarty->assign("state_create", $state_create);

            //reset($this->attr);
            // строка с главным параметром перехода на страницу - первый ключ в списке конструктора MainPage
            //$this->Smarty->assign("code_page", "index.php?".key($this->attr));
            
            
            
            // отобразить данные, вызов обязательно должен быть самым последним
            $this->Smarty->display($this->path_template."index.tpl.html");
            
        }

    } // end update()
    

    /** 
     * @brief получить содержимое нового конфигурационого файла
     * @return bool результат операции
     */
    function saveContextConfig($name_file, $address_host, $name_db_mysql, $first, $second, $admin_first, $admin_second, $prefix_test )
    {
    	$admin 		= base64_encode($admin_first);
    	$admin_pass = md5($admin_second);
    	 
		$str =     	
"<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+
// | ОПИСАНИЕ: конфигурационные данные для работы с базой данных

    define('DB_HOST', '$address_host');// адрес базы
    define('DB_USER', '$first');// обший пользователь
    define('DB_PASS', '$second');// пароль
    define('DB_NAME', '$name_db_mysql');// название базы
    define('TEST_DB_NAME', '$prefix_test'.DB_NAME);// название тестовой базы для запуска тестов (phpunit)    
    define('ADMIN_LOGIN', '$admin');// логин
    define('ADMIN_PASS', '$admin_pass');// хешированный пароль администратора

?>
";
		if( !rename( $name_file, $name_file."-old" ) ) {
			echo "невозможно переименовать файл $name_file в $name_file-old";
		}
		
		$f = @fopen($name_file,"w");
		if( $f ) {
			fputs($f, $str);
			fclose($f);
			return true;
		} else {
			return false;	
		}
		
    } // end getContextConfig()
    
}  // finish class InstallPage

?>
